package com.piece.core.mongo.entity;

import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.CompoundIndex;
import org.springframework.data.mongodb.core.index.CompoundIndexes;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
import java.io.Serializable;
import java.util.Date;

/**
 * 审计日志记录表 sys_audit_log
 */
@Data
@NoArgsConstructor
@Document(collection = "sys_audit_log")
@CompoundIndexes({
        @CompoundIndex(name = "index_sys_audit_log", def = "{'application_name':1,'module_name':1,'opera_id':1,'opera_time':1}")
})
public class MongoAuditLog implements Serializable {

    /**
     * 日志主键
     */
    @Id
    private String logId;

    /**
     * 应用名
     */
    @Field("application_name")
    @Indexed(expireAfterSeconds = 60 * 60 * 24 * 7) // 7天后过期
    private String applicationName;

    /**
     * 模块标题
     */
    @Field("module_name")
    private String moduleName;

    /**
     * JAVA类名
     */
    @Field("class_name")
    private String className;

    /**
     * 请求方法名称
     */
    @Field("method_name")
    private String methodName;

    /**
     * 请求参数
     */
    @Field("opera_param")
    private String operaParam;

    /**
     * 请求url
     */
    @Field("opera_url")
    private String operaUrl;

    /**
     * 业务类型
     * {@link com.piece.core.log.enums.AuditLogType}
     */
    @Field("business_type")
    private String businessType;

    /**
     * 操作类别（00后台用户 01外部用户）
     */
    @Field("operator_type")
    private String operatorType;

    /**
     * 操作地址
     */
    @Field("ip")
    private String ip;

    /**
     * 操作地点
     */
    @Field("area")
    private String area;

    /**
     * 操作城市
     */
    @Field("city")
    private String city;

    /**
     * 操作系统
     */
    @Field("os")
    private String os;

    /**
     * 浏览器
     */
    @Field("browser")
    private String browser;

    /**
     * 操作状态（0正常 1异常）
     */
    @Field("status")
    private String status;

    /**
     * 错误消息
     */
    @Field("desc")
    private String desc;

    /**
     * 租户id
     */
    @Field("client_id")
    private String clientId;

    /**
     * 操作账号ID
     */
    @Field("opera_id")
    private String operaId;

    /**
     * 操作账号名
     */
    @Field("opera_name")
    private String operaName;

    /**
     * 操作时间
     */
    @Field("opera_time")
    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date operaTime;
}
